SELECT文は、1つ以上の表からデータを取得します。取得されたデータは、結果表または問合せ結果と呼ばれる表の形式で表示されます。
TimesTenインスタンスでアクセス制御が有効な場合、この文にはSELECT権限またはデータ・ストア・オブジェクトの所有権が必要です。
SELECT文の一般的な構文は、次のとおりです。
SELECT [FIRST NumRows | ROWS M TO N] [ALL | DISTINCT] SelectList
FROM TableSpec [,...]
[WHERE SearchCondition]
[GROUP BY Expression [,...]]
[HAVING SearchCondition]
[ORDER BY {ColumnID| ColumnAlias | Expression {ASC | DESC}]
[,...]
[FOR UPDATE [OF [[Owner.]TableName.]ColumnName [,...] ]
[NOWAIT | WAIT Seconds] ]
集合演算子UNION、UNION ALL、MINUSまたはINTERSECTを含むSELECT文の構文は、次のとおりです。
SELECT [ROWS M TO N] [ALL] SelectList
FROM TableSpec [,...]
[WHERE SearchCondition]
[GROUP BY Expression [,...]]
[HAVING SearchCondition] [,...]
{UNION [ALL] | MINUS | INTERSECT}
SELECT [ROWS M TO N] [ALL] SelectList
FROM TableSpec [,...]
[WHERE SearchCondition]
[GROUP BY Expression [,...]]
[HAVING SearchCondition] [,...]
[ORDER BY {ColumnID| ColumnAlias | Expression {ASC | DESC}]
SELECT文には、次のパラメータがあります。
FIRST NumRows | 取得する行の数を指定します。NumRowsには、正のINTEGERか動的パラメータのプレースホルダを指定する必要があります。動的パラメータのプレースホルダの構文は、?または:DynamicParameterです。動的パラメータの値は、文の実行時に設定されます。 |
ROWS M TO N | 取得する行の範囲を指定します。Mは選択する先頭行、Nは選択する最終行です。行のカウントは行1から開始します。問合せSELECT ROWS 1 to N ...は、SELECT FIRST NumRowsと同じ行を返します(問合せが並べ替えられ、NとNumRowsの値が同じである場合)。 MとNの値には、正のINTEGERか動的パラメータのプレースホルダを指定する必要があります。動的パラメータのプレースホルダの構文は、?または:DynamicParameterです。動的パラメータの値は、文の実行時に設定されます。 |
ALL | 問合せ結果の重複する行が削除されないようにします。ALLまたはDISTINCTのいずれも指定しない場合、ALLとみなされます。 |
DISTINCT | 問合せ結果の各行が一意となるようにします。この比較では、NULL値はすべて同じとみなされます。重複行は評価されません。 |
SelectList | 問合せ結果の列の導出方法を指定します。SelectListの構文の詳細は、「SelectList」を参照してください。 |
FROM TableSpec |
SELECT文で参照される表を指定します。問合せごとの表の最大数は24です。 TableSpecは、行を選択する表を指定します。SELECT文のFROM句によって生成された導出表を指定することもできます。TableSpecの構文の詳細は、「TableSpec」を参照してください。 |
WHERE SearchCondition |
WHERE句は取得する行のセットを決定します。通常、SearchConditionがFALSEまたはNULLと評価された行は、処理対象となりません。ただし、SearchConditionは、外部結合を指定するために使用できます。外部結合では、外部表の行うち、関連する内部表に対するSearchConditionの評価がTRUEでない行も返され、内部表を参照する投影式がNULLに設定されます。 列およびROWID式に単項演算子(+)を使用して、外部結合を示すことができます。(+)演算子は、内部表を参照する結合条件のすべての列およびROWID式の後に指定する必要があります。(+)演算子を使用するにはいくつか条件があります。通常、これらの条件によって、作成できる外部結合問合せの種類は制限されます。(+)演算子はWHERE句に指定することができ、HAVING句には指定できません。2つの表を外部結合することはできません。外部結合条件をORで結ぶことはできません。 検索条件の詳細は、「検索条件」を参照してください。 |
GROUP BY Expression [,...] | GROUP BY句には、1つまたは複数の式を指定して、SelectListに集計関数を指定したり、行のグループに関数を適用する場合に使用します。
複雑な式でも記述できます。たとえば、単一または複数の列を指定したり、集計関数、算術演算子、ROWID擬似列またはNULLを含めることができます。指定できるのは、日付関数、ユーザー関数、定数または動的パラメータです。 GROUP BY句を使用する場合、SelectListには集計関数およびGROUP BY句で参照される列のみを含めることができます。SelectListに*、TableName.*、またはOwner.TableName.*構成要素が含まれている場合は、*に含まれているすべての列をGROUP BY句に含める必要があります。グループ化された行では、NULL値は同じ値とみなされます。他のすべての列が同じである場合、列中のすべてのNULLは単一のグループにまとめられます。 GROUP BY句を省略した場合、問合せの結果全体が1つのグループとして扱われます。 |
HAVING |
SELECT問合せでHAVING句を使用して、集計結果のグループをフィルタ処理できます。SELECT問合せにHAVING句が存在すると、問合せは集計問合せとなります。WHERE句を除くすべての句の集計関数のソース以外で参照されるすべての列は、GROUP BY句に指定する必要があります。 副問合せは、HAVING句で指定できます。 |
(+) | 単純な結合(内部結合とも呼ばれる)では、SearchConditionで指定された結合条件を満たす結合表の行の組合せごとに1行が返されます。外部結合はこの演算子の拡張機能であり、結合された内部表での一致する行の有無に関係なく、外部表のすべての行が返されます。一致する行がなかった場合は、内部表を参照する投影式にNULL値が与えられます。 |
ORDER BY | 指定した列または式に基づいて、問合せの結果行をソートします。ソート・キーとして使用する列を、優先順位の高いものから順に指定します。最大255の列を指定できます。列ごとに、ソート順序を昇順または降順で指定できます。ASCまたはDESCのいずれも指定しない場合は、昇順が適用されます。文字列は、ASCIIデータのASCII照合順番に従って比較されます。 ORDER BY句では、列の別名がサポートされています。列の別名は、ORDER BY句でのみ参照可能です。単一の問合せ内では、同じ名前を持つ、列の別名を複数宣言できますが、その別名を参照するとエラーが発生します。 ORDER BY句では、NCHAR型はサポートされていません。 |
ColumnID | SelectListの列に対応する必要があります。ソートする列を指定するには、その名前または序数を指定します。SelectListの最初の列の番号は1です。SelectListの列を参照する場合、それが単純な列でない場合は、列番号を使用する方が適切です。これには、集計関数、算術式、定数などが該当します。 ORDER BY句のColumnIDの構文は、次のとおりです。
{ColumnNumber | [[Owner.]TableName.] ColumnName} |
ColumnAlias | ORDER BY句で使用されます。列の別名はSelectListの列と対応している必要があります。同じ別名で複数の列を識別することができます。
{* | [Owner.]TableName.* | |
FOR UPDATE [OF [[Owner.] TableName.] ColumnName [,...]] [NOWAIT | WAIT Seconds] |
FOR UPDATE
FOR UPDATE [OF [[Owner.]TableName.]ColumnName [,...] ] [NOWAIT | WAIT Seconds] |
|
|
SelectQuery1 {UNION [ALL] | MINUS | INTERSECT} SelectQuery2 |
SelectQuery1およびSelectQuery2の結果が結合されることを指定します。SelectQuery1およびSelectQuery2は、いくつかの制限を含む一般的なSELECT文です。 UNION演算子は、2つの問合せの結果を結合します。それぞれの問合せ文のSelectListには互換性がある必要があります。UNION ALLが指定されている場合は、両方のSELECT文の重複行が保持されます。指定されていない場合、重複行は削除されます。 MINUS演算子は、2番目の問合せではなく最初の問合せで返された行を1つの結果に結合します。 INTERSECT演算子は、両方の問合せで返された行のみを1つの結果に結合します。 両方のSELECT文で選択された対応するエントリのデータ型には、互換性が必要です。データ型を変換するには、CAST演算子を使用します。NULL値可能かどうかは一致している必要はありません。 結果内の列の長さは、列に対応する選択値のうち長い方になります。最終的な結果の列名は、最も左側で選択された列の名前になります。 集合演算子UNION、UNION ALL、MINUS、INTERSECTを使用して、複数の問合せを組み合せることができます。 集合演算子の一方または両方のオペランドに集合演算子を指定できます。複数の集合演算子やネストされた集合演算子は、左から右に評価されます。 同じ問合せで集合演算子を同時に指定できます。 集合演算子を指定するSELECT文には、次の制限があります。
|
次の例では、SELECT文で列の別名を使用します。
次の例では、2つの表OrdersおよびLineItemsを使用します。
次のようにしてOrders表を作成します。
CREATE TABLE Orders(OrderNo INTEGER, OrderDate DATE, Customer CHAR(20));
CREATE TABLE LineItems(OrderNo INTEGER, LineNo INTEGER,
Qty INTEGER, UnitPrice DECIMAL(10,2));
つまり、注文ごとにOrders表に1つのレコードがあり、注文の各明細を示すレコードがLineItemsにあります。
年頭以降に入力されたすべてのOrdersの合計を検索するには、HAVING句を使用して、2000年1月1日以降に入力された注文のみを選択します。
SELECT O.OrderNo, CUSTOMER, ORDERDATE, SUM(Qty * UnitPrice)
FROM Orders O, LineItems L
WHERE O.OrderNo=L.OrderNo
GROUP BY O.OrderNo, CUSTOMER, ORDERDATE
HAVING ORDERDATE >= DATE '2000-01-01';
次の問合せは、次の条件を満たすTableAのすべての行をロックします。
また、この問合せは、次の条件を満たすTableBのすべての行もロックします。
WHERE句を指定しない場合、両方の表のすべての行がロックされます。
SELECT * FROM TableA, TableB
WHERE TableA.Column1 = TableB.Column1 AND TableB.Column2 > 5
FOR UPDATE
次の問合せは、内部表t2が2つの外部表(t1およびt3)に対応しているため、エラーとなります。
SELECT * FROM t1, t2, t3
WHERE t1.x = t2.x(+) and t3.y = t2.y(+);
次に、有効な構文を示します。
SELECT * FROM t1, t2
WHERE t1.x = t2.x(+);
外部結合条件はORで連結できないため、次の問合せはエラーとなります。
SELECT * FROM t1, t2, t3
WHERE t1.x = t2.x(+) OR t3.y = 5;
これに対し、次の問合せは有効です。
SELECT * FROM t1, t2, t3
WHERE t1.x = t2.x(+) AND (t3.y = 4 OR t3.y = 5);
IN演算子を使用して(+)記号の付いた列を比較することはできません。たとえば、次の問合せはエラーとなります。
SELECT * FROM t1, t2, t3
WHERE t1.x = t2.x(+) AND t2.y(+) IN (4,5);
これに対し、次の問合せは有効です。
SELECT * FROM t1, t2, t3
WHERE t1.x = t2.x(+) AND t1.y IN (4,5);
次の問合せでは、結合条件ごとに(+)演算子が指定されておらず、(+)が指定されていない条件は内部結合条件として扱われるため、外部結合ではなく内部結合が実行されます。
SELECT * FROM t1, t2
WHERE t1.x = t2.x(+) AND t1.y = t2.y;
次の問合せのWHERE句には、外部結合の内部表の列と定数を比較する条件が含まれています。(+)演算子が指定されていないため、この条件は内部結合として扱われます。
SELECT * FROM t1, t2
WHERE t1.x = t2.x(+) AND t2.y = 3;
2つの表を同時に外部結合できないため、次の問合せはエラーとなります。
SELECT * FROM t1, t2
WHERE x1 = x2(+) AND y2 = y1(+);
student表内の現在の順序値を検索します。
SELECT seq.CURRVAL FROM student;
次の問合せでは、(+)演算子が内部表t2の列x2に指定されていないため、条件x2 + y2(+) = 1は内部結合条件として扱われます。2つの表を同時に外部結合できないため、この文はエラーとなります。
SELECT * FROM t1, t2
WHERE x1 = x2(+) AND x2 + y2(+) = 1;
(+)演算子が結合条件に指定されていないため、次の問合せで外部結合は実行されません。
SELECT * FROM t1, t2
WHERE x2(+) = 1;
次の問合せのFROM句にはSELECT文が含まれているため、導出表が生成されます。
SELECT * FROM t1, (SELECT MAX(x2) MAXX2 FROM t2) tab2 WHERE t1.x1 = tab2.MAXX2;
次の問合せは、2つのSELECT文の結果を結合します。
カテゴリ内の最高価格と同じ価格のすべての注文を選択します。
この例では、INTERSECT集合演算子の使用方法を示しています。employees表にNULLのdepartment_idがあります。departments表では、department_idはNOT NULLの主キーとして定義されます。INTERSECT集合演算子を使用して返される行には、department_idがNULLのdepartments表の行は含まれません。
Command> SELECT department_id FROM employees INTERSECT SELECT department_id FROM departments;
< 10 >
< 20 >
< 30 >
< 40 >
< 50 >
< 60 >
< 70 >
< 80 >
< 90 >
< 100 >
< 110 >
Command> SELECT DISTINCT department_id FROM employees;
< 10 >
< 20 >
< 30 >
< 40 >
< 50 >
< 60 >
< 70 >
< 80 >
< 90 >
< 100 >
< 110 >
< <NULL> >
12 rows found.
この例では、最初の問合せでは返されるが、2番目の問合せでは返されない行を合わせて、MINUS集合演算子の使用方法を示します。employees表にNULLのdepartment_idを含む行のみが返されます。
Command> SELECT department_id FROM employees MINUS SELECT department_id FROM departments;
< <NULL> >
1 row found.
次の例では、employees表の従業員の給与を合計し、SUBSTR式を使用して、職務権限ごとにデータをグループ化します。
Command> SELECT SUBSTR (JOB_ID, 4,10), SUM (SALARY) FROM EMPLOYEES
GROUP BY SUBSTR (JOB_ID,4,10);
< PRES, 24000 >
< VP, 34000 >
< PROG, 28800 >
< MGR, 24000 >
< ACCOUNT, 47900 >
< MAN, 121400 >
< CLERK, 133900 >
< REP, 273000 >
< ASST, 4400 >
9 rows found.
この例では、GROUP BY句におけるSUBSTR式の使用方法およびHAVING句における副問合せの使用方法を示します。最初の10行が返されます。
Command> SELECT ROWS 1 TO 10 SUBSTR (JOB_ID, 4,10),department_id, manager_id, SUM (SALARY) FROM employees
>GROUP BY SUBSTR (JOB_ID,4,10),department_id, manager_id
> HAVING (department_id, manager_id) IN
> (SELECT department_id, manager_id FROM employees x
> WHERE x.department_id = employees.department_id)
> ORDER BY substr (job_id, 4,10),department_id,manager_id;
< ACCOUNT, 100, 108, 39600 >
< ACCOUNT, 110, 205, 8300 >
< ASST, 10, 101, 4400 >
< CLERK, 30, 114, 13900 >
< CLERK, 50, 120, 22100 >
< CLERK, 50, 121, 25400 >
< CLERK, 50, 122, 23600 >
< CLERK, 50, 123, 25900 >
< CLERK, 50, 124, 23000 >
< MAN, 20, 100, 13000 >
10 rows found.
次の例では、更新のためにemployees表をロックし、ロックが取得できるまで10秒間待機します。ロックが10秒以内に取得できない場合、エラーが返されます。最初の5行が選択されます。
Command> SELECT FIRST 5 last_name FROM employees FOR UPDATE WAIT 10;
< King >
< Kochhar >
< De Haan >
< Hunold >
< Ernst >
5 rows found.
この例では、更新のためにdepartments表をロックします。選択した行が別のプロセスにロックされており、ロックが取得できない場合はエラーが返されます。これは、NOWAITが指定されているためです。
Command> SELECT FIRST 5 last_name e FROM employees e, departments d WHERE e.department_id = d.department_id FOR UPDATE OF d.department_id NOWAIT;
< Whalen >
< Hartstein >
< Fay >
< Raphaely >
< Khoo >
5 rows found.
SELECT文のSelectListパラメータの構文は、次のとおりです。
{* | [Owner.]TableName.* |
{ Expression | [[Owner.]TableName.]ColumnName |
[[Owner.]TableName.]ROWID | NULL
}
[[AS] ColumnAlias] } [,...]
SELECT文のSelectListには、次のパラメータがあります。
次の文は、部品が配送されるまでの平均日数を返します。
SELECT AVG(DeliveryDays)
FROM Purchasing.SupplyPrice;
次の文は、20日未満で配送されるすべての部品の部品番号および配送時刻が返されます。
SELECT PartNumber, DeliveryDays
FROM Purchasing.SupplyPrice
WHERE DeliveryDays < 20;
単一の部品で複数行が返される場合があります。
次の文は、各部品の部品番号と平均価格を返します。
SELECT PartNumber, AVG(UnitPrice)
FROM Purchasing.SupplyPrice
GROUP BY PartNumber;
この例では、結合によってカリフォルニア州の業者の名前と住所が返されます。行は、PartNumberの昇順で返されます。重複するPartNumbers
を含む行は、VendorName
の昇順で返されます。
FROM句では、SelectListとWHERE句の両方で使用される、2つの相関名(vとs)を定義しています。
VendorNumber
は、Vendors
とSupplyPrice
で共通する唯一の列です。
SELECT PartNumber, VendorName, s.VendorNumber,
VendorCity
FROM Purchasing.SupplyPrice s,
Purchasing.Vendors v
WHERE s.VendorNumber = v.VendorNumber
AND VendorState = 'CA'
ORDER BY PartNumber, VendorName;
この問合せでは、表Purchasing.Partsをそれ自身に結合して、シリアル番号が1133-P-01
の部品と同じ販売価格の部品を特定します。
SELECT q.PartNumber, q.SalesPrice
FROM Purchasing.Parts p, Purchasing.Parts q
WHERE p.SalesPrice = q.SalesPrice AND
p.SerialNumber = '1133-P-01';
次に、特定の行のROWIDを取得する方法の例を示します。取得したROWIDの値は、後で別のSELECT文、CREATE VIEW文またはUPDATE文で使用できます。
SELECT ROWID
FROM Purchasing.Vendors
WHERE VendorNumber = 123;
次に、列の別名を使用して、employees
表からデータを取得する方法の例を示します。
SELECT max(salary) AS max_salary FROM employees;
SELECT文のTableSpecパラメータの構文は、次のとおりです。
{[Owner.]TableName [CorrelationName] | JoinedTable | DerivedTable}
単純な表指定の構文は、次のとおりです。
[Owner.]TableName
SELECT文のTableSpecには、次のパラメータがあります。
[Owner.]TableName | 参照する表を指定します。 |
CorrelationName |
CorrelationNameは、直前で指定した表へのシノニムを指定します。その表の列にアクセスする際、文の中で実際の表名ではなく相関名を使用します。相関名は、基本名の構文ルールを満たしている必要があります(「基本名」を参照)。 単一のUPDATE文のすべての相関名は、一意である必要があります。 |
DerivedTable | SELECT問合せの評価から導出された表を指定します。このSELECT問合せには、FIRST NumRowsまたはRows M to N句を指定できません。 |
JoinedTable |
表の結合を定義する問合せを指定します。JoinedTableの構文の詳細は、「JoinedTable」を参照してください。 |
導出表は、FROM句のSELECT文の結果で、別名を持ちます。
DerivedTableの構文は、次のとおりです。
(Subquery) [CorrelationName]
SELECT文のTableSpec句のDerivedTableには、次のパラメータがあります。
Subquery | 副問合せの詳細は、「副問合せ」を参照してください。 |
CorrelationName | CorrelationNameは、問合せで参照されるあらゆる表名と異なっている必要があります。CorrelationNameはオプションです。 |
導出表を使用する場合は、次の制限が適用されます。
JoinedTableには、CROSS JOIN、INNER、LEFTまたはRIGHT OUTER JOINから導出された表を指定します。
JoinedTableの構文は、次のとおりです。
{CrossJoin | QualifiedJoin}
CrossJoinは、次のようになります。
TableSpec1 CROSS JOIN TableSpec2
QualifiedJoinは、次のようになります。
TableSpec1 [JoinType] JOIN TableSpec2 ON SearchCondition
QualifiedJoinパラメータでは、JoinTypeの構文は、次のようになります。
{INNER | LEFT [OUTER] | |RIGHT [OUTER]}
SELECT文のTableSpec句のJoinedTableには、次のパラメータがあります。
次の文は表t1およびt2を結合して、t1の行でx1が10未満のものをすべて返します。